import Vue from "vue";
import VueRouter from "vue-router";
Vue.use(VueRouter);
import routes from "./routes";
import store from "@/store";

let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;
//VueRouter.prototype原型对象添加一个方法
//location:路由跳转相关的信息
VueRouter.prototype.push = function (location, resolve, reject) {
	//当前函数this：即为VueRouter类的实例
	//相当于push方法里面this，是windows【完犊子了】
	//利用人家push方法实现路由跳转，保证push里面this,应该vueRouter类的实例

	//面试:函数apply与call区别?
	//相同的地方:都可以篡改函数里面this
	//不同的地方:apply传递参数 数组  call传递参数 逗号分割

	if (resolve && reject) {
		//代表真:代表着两个形参接受参数【箭头函数】
		originPush.call(this, location, resolve, reject);
	} else {
		originPush.call(
			this,
			location,
			() => {},
			() => {}
		);
	}
};

const router = new VueRouter({
	routes,
	scrollBehavior(to, from, savedPosition) {
		// 始终滚动到顶部
		return { y: 0 };
	},
});

// 全局前置守卫
router.beforeEach(async (to, from, next) => {
	// to 想要去哪
	// from 从哪来的
	// next() -> 放行
	// next({path:"/xxx"}) -> 放行到指定路径
	// next(false) -> 终端导航，重置到from
	let token = localStorage.getItem("TOKEN");
	let userInfo = store.state.user.userInfo;

	if (token) {
		console.log("路由守卫：有token");
		if (to.path == "/login") {
			console.log("路由守卫：你都登录了，咋还想登录呢？");
			next("/");
		} else {
			if (userInfo.name) {
				console.log("路由守卫：有用户信息");
				next();
			} else {
				console.log("路由守卫：无用户信息，准备获取用户信息");

				try {
					// 拿着token获取用户信息
					await store.dispatch("user/getUserInfo");
					next();
				} catch (error) {
					// 失败的情况：token失效
					store.dispatch("user/userLogout");
					next("/login");
				}
			}
		}
	} else {
		// 用户为 游客身份
		// 想要跳转到任一带有"pay"/"center"的地址
		if (to.path.indexOf("pay") != -1 || to.path.indexOf("center") != -1) {
			// 都直接推到登录，并且将想要跳转的地址临时保存在query中，等待登录完成后直接跳转到源地址
			next("/login?markTo=" + to.path);
		} else {
			next();
		}
	}
});

export default router;
